package Structures;

import java.util.NoSuchElementException;

/**
 * Instancia estructuras de datos colas.
 * @author Jeremy
 * @author Gabriel
 * @author Rodrigo
 * @author Alexandre
 */
public class Queue {
    private SLLNode _first, _last;
    private int _length;
    
    /**
     * Construye una nueva cola con su primere y ultimo elemento en nulo
     * y su tamaño en cero.
     */
    public Queue () {
        _first = _last = null;
        _length = 0;
    }
    
    //////////////////////////////Getters y setters/////////////////////////////
    /**
     * Obtiene el tamaño de la cola.
     * @return Cantidad de elementos de la cola
     */
    public int getSize () {
        return _length;
    }
    
    /**
     * Obtiene el elemento del primer nodo de la cola, sin eliminarlo de la misma.
     * @return Primer elemento de la cola
     */
    public Node getFirst () {
        if  (_first == null) {
            throw new NoSuchElementException();
        }
        else {
            return (Node) _first.getElement();
        }
    }
    ////////////////////////////////////////////////////////////////////////////
    
    /**
     * Dice si la cola esta vacia o no.
     * @return true si la cola esta vacia, false de lo contrario
     */
    public boolean isEmpty () {
        return (_length == 0);
    }
    
    /**
     * Elimina todos los elementos de la cola y la deja completamente vacia.
     */
    public void clear () {
        _first = _last = null;
        _length = 0;
    }
    
    /**
     * Encola un elemento a la cola
     * @param pElement Elemento para encolar
     */
    public void enqueue (Node pElement) {
        SLLNode ins = new SLLNode (pElement, null);
        if (_last != null) {
            _last.setSucc(ins);
        }
        else {
            _first = ins;
        }
        _last = ins;
        _length++;
    }
    
    /**
     * Remueve el primer elemento de la cola y lo retorna.
     * @return 
     */
    public Node dequeue () {
        if (_first == null) {
            throw new NoSuchElementException();
        }
        else {
            Node frontEle = (Node) _first.getElement();
            _first = _first.getSucc();
            if (_first == null) {
                _last = null;
            }
            _length--;
            return frontEle;
        }
    }
    
    /**
     * Retorna un arreglo con los elementos de la cola.
     * @return Arreglo con el contenido en string de los nodos de la cola
     */
    public String[] printQueue () {
        String[] lis = new String[this._length];
        int i = 0;
        
        for (SLLNode n = this._first; n != null; n = n.getSucc()) {
            Node nNode = (Node) n.getElement();
            lis[i] = String.valueOf(nNode.getElement());
            i++;
        }
        return lis;
    }
}
